#include <iostream>
#include "Circle.h"
#include "Shape.h"
using namespace std;
void go(char * ch)
{
	cout << "go(char *ch)" << endl;
}
void go(int num)
{
	cout << "go(int num)" << endl;
}
/*
	联编是指一个计算机程序的不同部分彼此关联的过程。按照联编所进行的阶段不同，可分为两种不同的联编方法：静态联编和动态联编
	静态联编：
		是指联编工作在编译阶段完成的，这种联编过程是在程序运行之前完成的，又称为早期联编。要实现静态联编，在编译阶段就
	必须确定程序中的操作调用（如函数调用）与执行该操作代码间的关系，确定这种关系称为束定，在编译时的束定称为静态束定。
	静态联编对函数的选择是基于指向对象的指针或者引用的类型。其优点是效率高，但灵活性差。

	动态联编:
		是指联编在程序运行时动态地进行，根据当时的情况来确定调用哪个同名函数，实际上是在运行时虚函数的实现。
	这种联编又称为晚期联编，或动态束定。动态联编对成员函数的选择是基于对象的类型，针对不同的对象类型将做出不同的编译结果。
	C++中一般情况下的联编是静态联编，但是当涉及到多态性和虚函数时应该使用动态联编。动态联编的优点是灵活性强，但效率低

*/

void jingtailianbian()
{
	void(*f1)(char *) = go;
	void(*f2)(int) = go;

	f1(nullptr); //编译器编译时就确定的,叫静态联编
	f2(NULL);

}



//多态
//原理:虚函数表,放在每个包含有虚函数的类最前面
void duo_tai()
{
	Shape *shape = new Circle(3.21);

	double area = shape->get_area();
	cout << "area = " << area << endl;
	delete(shape);

	Circle *c = new Circle(5.20145);
	Shape *s = c;
	//向下转型
	Circle * c2 = dynamic_cast<Circle *> (s);
	cout << "area = " << c2->get_area() << endl;
	delete(c);
}
//虚函数表
void virtual_fun_table()
{
	Circle *c = new Circle();
	cout << sizeof(*c) << endl;//16
	delete(c);
}

void main()
{
	//duo_tai();
	//jingtailianbian();
	virtual_fun_table();
	system("pause");
}